home *** CD-ROM | disk | FTP | other *** search
/ The Very Best of Atari Inside / The Very Best of Atari Inside 1.iso / mint / mntlb20 / lib / lockf.c < prev    next >
C/C++ Source or Header  |  1992-02-11  |  1KB  |  86 lines

  1. /*
  2.  * lockf(3) and flock(2) emulation for MiNT by Dave Gymer
  3.  * Placed in the public domain; do with me as you will!
  4.  * BUGS: doesn't block, unlike BSD or SysV
  5.  */
  6.  
  7. #include "lib.h"
  8. #include <errno.h>
  9. #include <fcntl.h>
  10. #include <sys/file.h>
  11. #include <unistd.h>
  12. #include <mintbind.h>
  13.  
  14. static int
  15. do_lock(fd, cmd, size, whence)
  16.     int fd;
  17.     int cmd;
  18.     long size;
  19.     int whence;
  20. {
  21.     struct flock lock;
  22.     int fcmd;
  23.     long r;
  24.     extern int __mint;
  25.  
  26.     if (!__mint) {
  27.         errno = -EINVAL;
  28.         return -1;
  29.     }
  30.     lock.l_whence = whence;
  31.     lock.l_start = 0;
  32.     lock.l_len = size;
  33.     switch (cmd) {
  34.         case F_ULOCK:
  35.             lock.l_type = F_UNLCK;
  36.             fcmd = F_SETLK;
  37.             break;
  38.         case F_TEST:
  39.             lock.l_type = F_WRLCK;
  40.             fcmd = F_GETLK;
  41.             break;
  42.         case F_TLOCK:
  43.             lock.l_type = F_WRLCK;
  44.             fcmd = F_SETLK;
  45.             break;
  46.         case F_LOCK:
  47.             lock.l_type = F_WRLCK;
  48.             fcmd = F_SETLK;
  49.             break;
  50.         default:
  51.             errno = -EINVAL;
  52.             return -1;
  53.     }
  54.     if ((r = Fcntl(fd, &lock, fcmd)) < 0) {
  55.         errno = -r;
  56.         return -1;
  57.     }
  58.     return 0;
  59. }
  60.  
  61. int
  62. lockf(fd, cmd, size)
  63.     int fd;
  64.     int cmd;
  65.     long size;
  66. {
  67.     return do_lock(fd, cmd, size, 1);
  68. }
  69.  
  70. int
  71. flock(fd, op)
  72.     int fd, op;
  73. {
  74.     int cmd;
  75.  
  76.     if (op & (LOCK_SH | LOCK_EX))
  77.         cmd = (op & LOCK_NB) ? F_TLOCK : F_LOCK;
  78.     else if (op & LOCK_UN)
  79.         cmd = F_ULOCK;
  80.     else {
  81.         errno = -EINVAL;
  82.         return -1;
  83.     }
  84.     return do_lock(fd, cmd, 0L, 0);
  85. }
  86.